/*
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

/*
 *
 *
 *
 *
 *
 * Written by Doug Lea with assistance from members of JCP JSR-166
 * Expert Group and released to the public domain, as explained at
 * http://creativecommons.org/publicdomain/zero/1.0/
 */

package java.util.concurrent.locks;

import java.util.concurrent.TimeUnit;

/**
 * 当锁定和解锁发生在不同的作用域中时，
 * 必须小心确保在持有锁定时执行的所有代码都受到try finally或try catch的保护，以确保在必要时释放锁定。
 */
public interface Lock {

    /**
     * 获取锁
     * 如果锁不可用（即获取锁失败)，当前线程处于线程调度的目的将被禁用，并处于休眠状态，直至获取到锁，且在锁获取时无法被中断
     */
    void lock();

    /**
     * 获取锁
     * 与lock方法一样，只是会在线程被标记中断时停止获取锁
     */
    void lockInterruptibly() throws InterruptedException;

    /**
     * 尝试获取锁
     * 如果锁不可用，会立即返回失败
     */
    boolean tryLock();

    /**
     * 尝试获取锁
     * 与lockInterruptibly方法类似，只是额外增加了超时中断锁获取的操作
     */
    boolean tryLock(long time, TimeUnit unit) throws InterruptedException;

    /**
     * 释放锁
     */
    void unlock();

    /**
     * 创建一个绑定此Lock的Condition实例
     * Conditio的具体操作依赖于Lock实现，且在调用Condition的方法时需先获取到锁
     */
    Condition newCondition();
}
